Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / scripts / docs / regenerate-versions.py

Displaying Raw • Download

scripts/docs/regenerate-versions.py 5235b8fc51eb5f46d453effb2deec00bcc6abdbb (5235b8fc) Text, 5.33 KB

T8b949e#!/usr/bin/env python3
T8b949e"""Regenerate versions.json (and the root placeholder) for the docs site.

Scans a built gh-pages tree and derives the manifest consumed by the site's
version switcher from the directories actually present, so the manifest can
never disagree with what is published.

Channel layout on gh-pages:
/ production release docs (owns the root)
/vX.Y.Z/ permanent per-release snapshot
/vX.Y.Z-open.N/ per-tag open-testing snapshot
/vX.Y.Z-closed.N/ per-tag closed-testing snapshot
/main/ snapshot of the main branch
/api/ Dokka reference (unversioned)

Prerelease snapshots accumulate during a version cycle and are reaped by
post-release-cleanup.yml once the production vX.Y.Z tag ships.

Usage: regenerate-versions.py <site-dir>
"""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787sys

Te6edf3RELEASE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^v(Ta5d6ff\Ta5d6ffd+)Ta5d6ff\Ta5d6ff.(Ta5d6ff\Ta5d6ffd+)Ta5d6ff\Ta5d6ff.(Ta5d6ff\Ta5d6ffd+)$Ta5d6ff"Tb4b4b4)
Te6edf3PRERELEASE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff^v(Ta5d6ff\Ta5d6ffd+)Ta5d6ff\Ta5d6ff.(Ta5d6ff\Ta5d6ffd+)Ta5d6ff\Ta5d6ff.(Ta5d6ff\Ta5d6ffd+)-(open|closed)Ta5d6ff\Ta5d6ff.(Ta5d6ff\Ta5d6ffd+)$Ta5d6ff"Tb4b4b4)

T8b949e# Marks a root index.html this script generated. Production release content
T8b949e# never carries it, which is how we tell "root is unowned, retarget it freely"
T8b949e# apart from "a real release owns the root, leave it alone".
Te6edf3PLACEHOLDER_MARKER Tff7b72= Ta5d6ff"Ta5d6ff<!-- meshtastic-docs-root-placeholder -->Ta5d6ff"

Te6edf3PLACEHOLDER Tff7b72= Tb4b4b4(
Te6edf3PLACEHOLDER_MARKER
Tff7b72+ Ta5d6ff"""
Ta5d6ff<!DOCTYPE html>
Ta5d6ff<html lang=Ta5d6ff"Ta5d6ffenTa5d6ff"Ta5d6ff>
Ta5d6ff<head>
Ta5d6ff <meta charset=Ta5d6ff"Ta5d6ffUTF-8Ta5d6ff"Ta5d6ff>
Ta5d6ff <meta http-equiv=Ta5d6ff"Ta5d6ffrefreshTa5d6ff"Ta5d6ff content=Ta5d6ff"Ta5d6ff0; url=./Tffd700{target}Ta5d6ff/Ta5d6ff"Ta5d6ff>
Ta5d6ff <title>Meshtastic Android Docs</title>
Ta5d6ff</head>
Ta5d6ff<body><a href=Ta5d6ff"Ta5d6ff./Tffd700{target}Ta5d6ff/Ta5d6ff"Ta5d6ff>Redirecting to the Tffd700{target}Ta5d6ff docs…</a></body>
Ta5d6ff</html>
Ta5d6ff"""
Tb4b4b4)

T8b949e# Track ranking for the switcher and the root fallback. Open testing is publicly
T8b949e# available, so it outranks closed testing. Sequence numbers are per-track
T8b949e# counters and are never compared across tracks.
Te6edf3TRACK_RANK Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffopenTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffclosedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}


Tff7b72def Td2a8ffscanTb4b4b4(Te6edf3siteTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657listTb4b4b4[Tffa657dictTb4b4b4]Tb4b4b4, Tffa657listTb4b4b4[Tffa657dictTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3releasesTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3prereleasesTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3siteTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3siteTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3m Tff7b72:= Te6edf3RELEASETff7b72.Td2a8ffmatchTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3releasesTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6ffdirTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3mTff7b72.Td2a8ffgroupsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffsortTa5d6ff"Tb4b4b4: Tffa657tupleTb4b4b4(Tffa657intTb4b4b4(Te6edf3xTb4b4b4) Tff7b72for Te6edf3x Tff7b72in Te6edf3mTff7b72.Td2a8ffgroupsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4}
Tb4b4b4)
Tff7b72elif Te6edf3m Tff7b72:= Te6edf3PRERELEASETff7b72.Td2a8ffmatchTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3majorTb4b4b4, Te6edf3minorTb4b4b4, Te6edf3patchTb4b4b4, Te6edf3trackTb4b4b4, Te6edf3seq Tff7b72= Te6edf3mTff7b72.Td2a8ffgroupsTb4b4b4(Tb4b4b4)
Te6edf3prereleasesTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffdirTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Tffd700{Te6edf3majorTffd700}Ta5d6ff.Tffd700{Te6edf3minorTffd700}Ta5d6ff.Tffd700{Te6edf3patchTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftrackTa5d6ff"Tb4b4b4: Te6edf3trackTb4b4b4,
Ta5d6ff"Ta5d6ffseqTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Te6edf3seqTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsortTa5d6ff"Tb4b4b4: Tb4b4b4(Tffa657intTb4b4b4(Te6edf3majorTb4b4b4)Tb4b4b4, Tffa657intTb4b4b4(Te6edf3minorTb4b4b4)Tb4b4b4, Tffa657intTb4b4b4(Te6edf3patchTb4b4b4)Tb4b4b4, Tffa657intTb4b4b4(Te6edf3seqTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tb4b4b4)
Te6edf3releasesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3rTb4b4b4: Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffsortTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# Group by track (open before closed), newest version/sequence first within
T8b949e# each. Track must dominate: 'seq' counts up independently per track, so
T8b949e# comparing open.1 against closed.10 numerically would be meaningless.
Te6edf3prereleasesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3pTb4b4b4: Tb4b4b4(Te6edf3TRACK_RANKTb4b4b4[Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftrackTa5d6ff"Tb4b4b4]Tb4b4b4]Tb4b4b4, Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffsortTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3releasesTb4b4b4, Te6edf3prereleases


Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4) Tff7b72!= T79c0ff2Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffusage: Tffd700{Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff <site-dir>Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff2
Te6edf3site Tff7b72= Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3siteTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffnot a directory: Tffd700{Te6edf3siteTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff2

Te6edf3releasesTb4b4b4, Te6edf3prereleases Tff7b72= Te6edf3scanTb4b4b4(Te6edf3siteTb4b4b4)
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fflatestTa5d6ff"Tb4b4b4: Te6edf3releasesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3releases Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffversionsTa5d6ff"Tb4b4b4: Tb4b4b4[Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3releasesTb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffprereleasesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4{Te6edf3kTb4b4b4: Te6edf3pTb4b4b4[Te6edf3kTb4b4b4] Tff7b72for Te6edf3k Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffdirTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftrackTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffseqTa5d6ff"Tb4b4b4)Tb4b4b4} Tff7b72for Te6edf3p Tff7b72in Te6edf3prereleasesTb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffhasMainTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3siteTb4b4b4, Ta5d6ff"Ta5d6ffmainTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3siteTb4b4b4, Ta5d6ff"Ta5d6ffversions.jsonTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3manifestTb4b4b4, Te6edf3handleTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4)

T8b949e# The root belongs to production releases. Until one exists, redirect it to
T8b949e# the best available channel so the Pages URL is never a 404:
T8b949e# newest open prerelease -> newest closed prerelease -> main snapshot.
T8b949e#
T8b949e# Re-evaluated on every run so the root upgrades as better channels appear
T8b949e# (main -> closed -> open), but only when the current root is our own
T8b949e# placeholder — real release content is never overwritten.
Te6edf3root_index Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3siteTb4b4b4, Ta5d6ff"Ta5d6ffindex.htmlTa5d6ff"Tb4b4b4)
Te6edf3owned_by_release Tff7b72= Tff7b72False
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3root_indexTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3root_indexTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3owned_by_release Tff7b72= Te6edf3PLACEHOLDER_MARKER Tff7b72not Tff7b72in Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tffa657lenTb4b4b4(Te6edf3PLACEHOLDER_MARKERTb4b4b4) Tff7b72+ T79c0ff64Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3owned_by_releaseTb4b4b4:
Te6edf3target Tff7b72= Tffa657nextTb4b4b4(Tb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffdirTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3p Tff7b72in Te6edf3prereleases Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftrackTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffopenTa5d6ff"Tb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72or Tffa657nextTb4b4b4(
Tb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffdirTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3p Tff7b72in Te6edf3prereleases Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftrackTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffclosedTa5d6ff"Tb4b4b4)Tb4b4b4, Tff7b72None
Tb4b4b4)
Tff7b72if Te6edf3target Tff7b72is Tff7b72None Tff7b72and Te6edf3manifestTb4b4b4[Ta5d6ff"Ta5d6ffhasMainTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3target Tff7b72= Ta5d6ff"Ta5d6ffmainTa5d6ff"
Tff7b72if Te6edf3targetTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3root_indexTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3PLACEHOLDERTff7b72.Td2a8ffformatTb4b4b4(Te6edf3targetTff7b72=Te6edf3targetTb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRoot placeholder -> Tffd700{Te6edf3targetTffd700}Ta5d6ff/ (no production release published yet)Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRoot is owned by a production release; left untouched.Ta5d6ff"Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffversions.json: Tffd700{Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3manifestTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return T79c0ff0


Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(Te6edf3mainTb4b4b4(Tb4b4b4)Tb4b4b4)

Served by rngit 1.5.0 - Generated in 0.07s